package motor;

import java.awt.Graphics;
import java.util.ArrayList;

import perso.MotorPersoImp;



import utils.Vector2d;

public class Motor
{
	ArrayList<MotorPerso> mp = new ArrayList<MotorPerso>();

	public Surface s;
	private float	sizeColliOfficiel = 2;
	private ArrayList<Unite> populationOfficielle = new ArrayList<Unite>();

	public Motor(Surface surface)
	{
		s = surface;
		
		
		mp.add( new MotorPersoImp( this , 1 ) );
		mp.add( new MotorPersoImp( this , 2 ) );
	}

	public void draw(Graphics buffer_canvas)
	{
		for( int i = 0 ; i < mp.size() ; i++)
		{
			mp.get(i).draw(buffer_canvas);
		}
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			populationOfficielle.get(i).draw( buffer_canvas );
		}
	}

	public void goOn()
	{
		
		ArrayList<Unite> populationMort = new ArrayList<Unite>();
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			visionEnemi( populationOfficielle.get(i) );
		}
		
		for( int i = 0 ; i < mp.size() ; i++ )
			mp.get(i).goOn();
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			populationOfficielle.get(i).goOn( this );
		}
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			if( populationOfficielle.get(i).isDead() )
				populationMort.add( populationOfficielle.get(i) );
		}
		
		populationOfficielle.removeAll(populationMort);
		
		for( int i = 0 ; i < mp.size() ; i++ )
			mp.get(i).retirerMort( populationMort );
	}

	public void ajoutUnite(Unite u)
	{
		populationOfficielle.add(u);
	}
	

	public void visionEnemi(Unite u )
	{
		ArrayList<Unite> a = new ArrayList<Unite>();
		
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			float dis = u.distance( populationOfficielle.get(i).getPos() );
			
			if( dis < u.getVision() && s.cansee( populationOfficielle.get(i).getPos() , u.getPos() ) == null )
			{
				if( populationOfficielle.get(i).getCamp() != u.getCamp() )
				{
					a.add(populationOfficielle.get(i));
				}
			}
		}
		
		u.setEnnemis( a );
	}
	
	public boolean collision(Unite mere)
	{
		for( int i = 0 ; i < populationOfficielle.size() ; i++ )
		{
			float dis = mere.distance( populationOfficielle.get(i).getPos() );
			
			if( dis < populationOfficielle.get(i).getSize()/2 + mere.getSize()/2 + sizeColliOfficiel )
			{
				return true;
			}
		}

		return false;
	}
}
